trait Parsers {
fn bark(&self) {
}
fn run(&self) {
}
// signature만 있는 경우, abstract역할
}
// 걍 앞에 쓰는거만 다르네
impl Parsers for TypeName {
// override
fn bark(&self) {
}
}
use std::fmt;
#[derive(Debug)]
struct Cat {
name: String,
age: u8
}
impl fmt::Display for Cat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}, {}", self.name, self.age);
}
}
fn main() {
let ma = Cat {
name: "aa".to_string(),
age: 9,
};
println!("{ma}");
}
where T: FightFromDistance + Debug
String::from(30)
일때 30을 "30"으로 한다던가 (실제 그런건 아니고 가정하는거임)fn main() {
let a = String::from("Daa"); // make typedef String from xxx
let b: String = "asdf".into(); // xxx -> into, typedef String
let vv = Vec::from([1,2,3]); // [i32;3] from이 있는거임 From[T;N] trait
}
fn print_vec<T: Display>(input: &Vec<T>) {
for item in input {
print!("{item} ");
}
println!();
}
fn main() {
let x = String::from("thth");
print_vec(&array_vec);
let str_vec = Vec::from("What kind of vec is this?");
print_vec(&str_vec);
let string_vec = Vec::from("What kind of Vec is a String vec?");
print_vec(&string_vec);
}
// 제공할 Type -> Struct 변환
impl From<Type> for STRUCT {
}
From implement했으면 into()
는 자동으로 생김
...iter().for_each().into()
감싼다. implementing trait for every type that you want to have
trait Prints {
fn print() {
println!("asdf");
}
}
struct Person;
struct Building;
// 아무 타입에 대해 부여하기(?)
impl<T> Prints for T {
}
fn main() {
let p = Person;
let b = Building;
p.print();
}
// Debug에 대해서만 Prints trait을 적용 타이핑
// trait boundary
trait Prints: Debug {
//...
// 이런식으로 따로따로도 가능하다
fn asdf($self) where Self: Display {
}
}
impl<T: Debug> Prints for T {
}
use std::fmt::Display;
// T로 convert될 수 있는 모든 타입에 대해 받을 수 있음
fn print_it<T: Display + AsRef<str>>(input: T) {
println!("{input}");
}
fn main() {
print_it("asdfasdf");
print_it(String::from("asdfasdf"));
}
객체 속성을 출력하기 위해서 trait 설정을 해야한다.
#[derive(Debug)]
struct Object {
//...
}
이런식으로 하고 나중에
// print debug
// {:?} primitive는 자동으로 해준다.
// pretty print
// {:#?}
println!("{:#?}", o);
use std::fmt;
#[derive(Display)]
struct Object {
//...
}
impl fmt::Display for Object {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({}, {}) and Area: {}", self.width, self.height, self.area())
}
}
//...
println!("{}", o);
Eq
, PartialEq
, Ord
, PartialOrd
Clone
, T
에서 copy를 통해 &T
를 생성하기 위함Copy
, type에 'move semantics'대신에 'copy semantics'를 부여함Hash
, &T
에서 해쉬값을 뽑아냄Default
&T
는 인스턴스?
fn give_thing<T>(input: T) -> T {
input
}
// Display trait이 있는 애들만
fn give_th<T: Display>(input: T) -> T {
println!("{}", input); // Display
input
}
// PartialOrd; Ordinal 순서용 compare용
// <... > generic을 where 절을 이용해도됨
fn aaaa<T: Display, U: Display + PartialOrd>(statement: T, num1: U, num2: U) {
println!("{} is {} greater than {}? {}", statement, num1, num2, num1 > num2);
}
fn aaaa<T, U>(statement: T, num1: U, num2: U)
where T: Display
{
println!("{} is {} greater than {}? {}", statement, num1, num2, num1 > num2);
}